組合語言的定址,應該不少人是掛在這個地方。一是高階語言,寫程式時沒有位址的概念,
只有C語言裏有指標,取值/址的概念(這裏,類似的,掛掉一堆學習者)。
適當的追蹤工具,適當的圖示概念。或許筆者當初入時,不會那麼容易舉白旗掛掉。
定址之後還會陸續提到。
debug裏的參數d,讓我們可以看記憶體的內容。而參數r可以看暫存器,而u可以看反組繹,
都是增進理解的好工具。雖然它們同時被拿來做破解的工具。水能載舟亦能覆舟吧。
同樣來自加拿大女教授的教學影片,
Relative Addressing in Assembly Control Flow Instructions
網址是http://www.youtube.com/watch?v=T11TYhoUn-8&feature=plcp
實在是太簡易了,筆者不敢想像,這樣的概念當初就是無法接受及理解。
C:\>debug
-a cs:100
08FA:0100 mov bx,200
08FA:0103 jmp 200
08FA:0106
-d
08FA:0100 BB 00 02 E9 FA 00 74 04-C6 04 5C 46 80 7C FF 5C ......t...\F.|.\
jmp 200跳到位址200的相對位址。
藉由參數d, 我們可了解,mov bx,200寫入記憶體變成BB 00 02,所以E9 FA,就是jmp 200的機器碼。
這時就有玄機了,一樣是兩百,電腦翻譯成不一樣的數字。此乃玄機一。
FA, 以16進位來說,和200有什麼關係呢?原來106加上FA等於200。
所以跳到200,其實是從106往前跳FA才到達200,指令是在位址103。
小結:組合語言還是人可以讀懂的語言,機器碼真的難讀了,不見得和組語是1對1的關係。
所以mov bx,200佔3個位址,不是mov 佔1bx佔1,200佔1,而是mov bx佔1,200佔2。
而jmp 200不是直接跳過去,而是藉由IP 暫存器的輔助,藉由那時的IP指到106,
再往前FA,就到200。大家會說,電腦怎麼把一件簡單的事搞複雜了,硬是讓人頭痛,
又要吃一顆普拿疼。
不少教學文章,會一次列出常用的6種定址法,解釋意思就好幾頁了,範例程式再跑一下,還沒弄清什麼是什麼時,下一章節又來了。
網路上的自主學習,有時候,不是所有資料務求在最短時間內吞下去,
不能理解實作的內容,其實別急著吞下去。
在資訊爆炸讓人資訊焦慮的時代,九把刀所謂慢慢來比較快的道理,讓人玩味再三。
106+FA=200, 影片中的教授用計算機(支援16進位的)來按,
A+6=16,A是10,進位,F是15,加1,16又進位,得到200。
----------------------------------
組合語言的16進位制,算10進位加減乘除就有不少數學好講,
這部分,當然又掛掉不少所謂數學不好的人。
以15年不到的從業經驗,如果說,寫程式和數學有關的話,大概就是
組合語言的這部分了。而邏輯好不好其實和數學好不好無關。
因為工作上幾乎用不到演算法,
所以數學不好也沒差。
筆者在念數學系時,幾乎都念到當掉,幾乎空白了四年時間。數學和組語都是筆者沒法即時理解的學問。目前經由網路學習,這些遺憾也許都能補足。
數學是什麼 能吃嗎
我還是敲敲指令、看看log就好...
忘了坐沙發
組合語言處理負數,蠻傷腦筋。
負數用人腦來處理,真是簡單多了。
電腦怎麼會用這種方式在計算負數,
真讓人
老師最愛考這些。